home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Config / Container / XML.php < prev   
PHP Script  |  2004-10-01  |  9KB  |  241 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Author: Bertrand Mansion <bmansion@mamasam.com>                      |
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: XML.php,v 1.11 2004/06/04 09:59:59 mansion Exp $
  19.  
  20. require_once('XML/Parser.php');
  21. require_once('XML/Util.php');
  22.  
  23. /**
  24. * Config parser for XML Files
  25. *
  26. * @author      Bertrand Mansion <bmansion@mamasam.com>
  27. * @package     Config
  28. */
  29. class Config_Container_XML extends XML_Parser {
  30.  
  31.     /**
  32.     * This class options:
  33.     * version (1.0) : XML version
  34.     * encoding (ISO-8859-1) : XML content encoding
  35.     * name      : like in phparray, name of your config global entity
  36.     * indent    : char used for indentation
  37.     * linebreak : char used for linebreak
  38.     * addDecl   : whether to add the xml declaration at beginning or not
  39.     * useAttr   : whether to use the attributes
  40.     * isFile    : whether the given content is a file or an XML string
  41.     *
  42.     * @var  array
  43.     */
  44.     var $options = array('version'   => '1.0',
  45.                          'encoding'  => 'ISO-8859-1',
  46.                          'name'      => '',
  47.                          'indent'    => '  ',
  48.                          'linebreak' => "\n",
  49.                          'addDecl'   => true,
  50.                          'useAttr'   => true,
  51.                          'isFile'    => true);
  52.  
  53.     /**
  54.     * Container objects
  55.     *
  56.     * @var  array
  57.     */
  58.     var $containers = array();
  59.  
  60.     /**
  61.     * Constructor
  62.     *
  63.     * @access public
  64.     * @param    string  $options    Options to be used by renderer
  65.     *                               version     : (1.0) XML version
  66.     *                               encoding    : (ISO-8859-1) XML content encoding
  67.     *                               name        : like in phparray, name of your config global entity
  68.     *                               indent      : char used for indentation
  69.     *                               linebreak   : char used for linebreak
  70.     *                               addDecl     : whether to add the xml declaration at beginning or not
  71.     *                               useAttr     : whether to use the attributes
  72.     *                               isFile      : whether the given content is a file or an XML string
  73.     */
  74.     function Config_Container_XML($options = array())
  75.     {
  76.         foreach ($options as $key => $value) {
  77.             $this->options[$key] = $value;
  78.         }
  79.     } // end constructor
  80.  
  81.     /**
  82.     * Parses the data of the given configuration file
  83.     *
  84.     * @access public
  85.     * @param string $datasrc    path to the configuration file
  86.     * @param object $obj        reference to a config object
  87.     * @return mixed returns a PEAR_ERROR, if error occurs or true if ok
  88.     */
  89.     function &parseDatasrc($datasrc, &$obj)
  90.     {
  91.         $this->folding = false;
  92.         $this->cdata = null;
  93.         $this->XML_Parser($this->options['encoding'], 'event');
  94.         $this->containers[0] =& $obj->container;
  95.         if (is_string($datasrc)) {
  96.             if ($this->options['isFile']) {
  97.                 $err = $this->setInputFile($datasrc);
  98.                 if (PEAR::isError($err)) {
  99.                     return $err;
  100.                 }
  101.                 $err = $this->parse();
  102.             } else {
  103.                 $err = $this->parseString($datasrc, true);
  104.             }
  105.         } else {
  106.            $this->setInput($datasrc);
  107.            $err = $this->parse();
  108.         }
  109.         if (PEAR::isError($err)) {
  110.             return $err;
  111.         }
  112.         return true;
  113.     } // end func parseDatasrc
  114.  
  115.     /**
  116.     * Handler for the xml-data
  117.     *
  118.     * @param mixed  $xp         ignored
  119.     * @param string $elem       name of the element
  120.     * @param array  $attribs    attributes for the generated node
  121.     *
  122.     * @access private
  123.     */
  124.     function startHandler($xp, $elem, &$attribs)
  125.     {
  126.         $container =& new Config_Container('section', $elem, null, $attribs);
  127.         $this->containers[] =& $container;
  128.         return null;
  129.     } // end func startHandler
  130.  
  131.     /**
  132.     * Handler for the xml-data
  133.     *
  134.     * @param mixed  $xp         ignored
  135.     * @param string $elem       name of the element
  136.     *
  137.     * @access private
  138.     */
  139.     function endHandler($xp, $elem)
  140.     {
  141.         $count = count($this->containers);
  142.         $container =& $this->containers[$count-1];
  143.         $currentSection =& $this->containers[$count-2];
  144.         if (count($container->children) == 0) {
  145.             $container->setType('directive');
  146.             $container->setContent(trim($this->cdata));
  147.         }
  148.         $currentSection->addItem($container);
  149.         array_pop($this->containers);
  150.         $this->cdata = null;
  151.         return null;
  152.     } // end func endHandler
  153.  
  154.     /*
  155.     * The xml character data handler
  156.     *
  157.     * @param mixed  $xp         ignored
  158.     * @param string $data       PCDATA between tags
  159.     *
  160.     * @access private
  161.     */
  162.     function cdataHandler($xp, $cdata)
  163.     {
  164.         $this->cdata .= $cdata;
  165.     } //  end func cdataHandler
  166.  
  167.     /**
  168.     * Returns a formatted string of the object
  169.     * @param    object  $obj    Container object to be output as string
  170.     * @access   public
  171.     * @return   string
  172.     */
  173.     function toString(&$obj)
  174.     {
  175.         static $deep = -1;
  176.         $indent = '';
  177.         if (!$obj->isRoot()) {
  178.             // no indent for root
  179.             $deep++;
  180.             $indent = str_repeat($this->options['indent'], $deep);
  181.         } else {
  182.             // Initialize string with xml declaration
  183.             $string = '';
  184.             if ($this->options['addDecl']) {
  185.                 $string .= XML_Util::getXMLDeclaration($this->options['version'], $this->options['encoding']);
  186.                 $string .= $this->options['linebreak'];
  187.             }
  188.             if (!empty($this->options['name'])) {
  189.                 $string .= '<'.$this->options['name'].'>'.$this->options['linebreak'];
  190.                 $deep++;
  191.                 $indent = str_repeat($this->options['indent'], $deep);
  192.             }
  193.         }
  194.         if (!isset($string)) {
  195.             $string = '';
  196.         }
  197.         switch ($obj->type) {
  198.             case 'directive':
  199.                 $attributes = ($this->options['useAttr']) ? $obj->attributes : array();
  200.                 $string .= $indent.XML_Util::createTag($obj->name, $attributes, $obj->content);
  201.                 $string .= $this->options['linebreak'];
  202.                 break;
  203.             case 'comment':
  204.                 $string .= $indent.'<!-- '.$obj->content.' -->';
  205.                 $string .= $this->options['linebreak'];
  206.                 break;
  207.             case 'section':
  208.                 if (!$obj->isRoot()) {
  209.                     $string = $indent.'<'.$obj->name;
  210.                     $string .= ($this->options['useAttr']) ? XML_Util::attributesToString($obj->attributes) : '';
  211.                 }
  212.                 if ($children = count($obj->children)) {
  213.                     if (!$obj->isRoot()) {
  214.                         $string .= '>'.$this->options['linebreak'];
  215.                     }
  216.                     for ($i = 0; $i < $children; $i++) {
  217.                         $string .= $this->toString($obj->getChild($i));
  218.                     }
  219.                 }
  220.                 if (!$obj->isRoot()) {
  221.                     if ($children) {
  222.                         $string .= $indent.'</'.$obj->name.'>'.$this->options['linebreak'];
  223.                     } else {
  224.                         $string .= '/>'.$this->options['linebreak'];
  225.                     }
  226.                 } else {
  227.                     if (!empty($this->options['name'])) {
  228.                         $string .= '</'.$this->options['name'].'>'.$this->options['linebreak'];
  229.                     }
  230.                 }
  231.                 break;
  232.             default:
  233.                 $string = '';
  234.         }
  235.         if (!$obj->isRoot()) {
  236.             $deep--;
  237.         }
  238.         return $string;
  239.     } // end func toString
  240. } // end class Config_Container_XML
  241. ?>